MySQL 精简笔记

原创内容,转载请注明出处!

学习目标:

  • 完成 MySQL 的安装及登陆基本操作
  • 能通过 SQL 对数据库进行 CRUD
  • 能通过 SQL 对表进行 CRUD
  • 能通过 SQL 对数据进行 CRUD
  • 约束、数据库设计
  • 多表查询、视图
  • 事务、索引
  • 本文只涉及 MySQL 初级使用的必备知识,后续知识请查阅其他资料……

一、数据库相关概念

以前我们做系统,数据持久化的存储采用的是文件存储。

存储到文件中可以达到系统关闭数据不会丢失的效果,但是文件存储也有它的弊端。

假设在文件中存储以下的数据:

假设现要修改李四为男性,我们现学习的 IO 技术可以通过将所有的数据读取到内存中,然后进行修改再存到该文件中。通过这种方式操作存在很大问题,现在只有三条数据,如果文件中存储1T的数据,那么就会发现内存根本就存储不了。就算内存足够存储,数据的操作与管理也极不方便。

现需要既能持久化存储数据,也要能避免上述问题的技术使用在我们的系统中。数据库就是这样的一门技术。

2.1 数据库

数据库就是将数据存储在硬盘上,可以达到持久化存储的效果。

2.2 数据库管理系统

在电脑上安装了数据库管理系统后,就可以通过数据库管理系统创建数据库来存储数据,也可以通过该系统对数据库中的数据进行数据的增删改查相关的操作。我们平时说的 MySQL 数据库其实是 MySQL 数据库管理系统。

image-20210721185923635

通过上面的描述,大家应该已经知道了数据库管理系统数据库的关系。那么有哪些常见的数据库管理系统呢?

2.3 常见的数据库管理系统

image-20220524091804314

接下来对上面列举的数据库管理系统进行简单的介绍:

我们学习的是 MySQL 数据库管理系统,Oracle 在一些公司也有使用,此时大家肯定会想以后在公司中如果使用我们没有学习过的Oracle 数据库管理系统怎么办?这点大家大可不必担心,如下图所示:

image-20210721185303106

我们可以通过数据库管理系统操作数据库,对数据库中的数据进行增删改查操作,而怎么样让用户跟数据库管理系统打交道呢?通过一门数据库语言(SQL)来实现。并且 SQL 是关系型数据库的通用语言,所以学会 SQL 那么无论遇到哪种关系型数据库都问题不大。

2.4 SQL

非关系型数据库(NoSql)

  • MongoDB:基于分布式文件存储的数据库。由 C++ 语言编写,旨在为 Web 应用提供可扩展的高性能数据存储解决方案
  • Redis(Remote Dictionary Server ),即远程字典服务:是一个开源的使用 ANSI-C 语言编写、支持网络、可基于内存亦可持久化的日志型、Key-Value 数据库,并提供多种语言的 API(常用于缓存数据库)

二、MySQL基础

2.1 MySQL安装

安装环境:Windows11 64位 软件版本:MySQL 5.7.24 解压版(绿色安装版)

2.1.1 下载

https://downloads.mysql.com/archives/community/

点开上面的链接就能看到如下界面:

image-20220524112339181

选择和自己系统位数相对应的版本点击右边的Download即可下载。

image-20220524112527862

2.1.2 安装

下载完成后我们得到的是一个压缩包,将其解压,我们就可以得到 MySQL 5.7.24 的软件本体了(就是一个文件夹),我们可以把它放在你想安装的位置。

image-20220524112716173

2.2 MySQL配置

2.2.1 添加环境变量

环境变量里面有很多选项,这里我们只用到Path这个参数。为什么在初始化的开始要添加环境变量呢? 在终端中输入一个可执行程序的名字,Windows会先在环境变量中的Path所指示的路径中寻找一遍,如果找到了就直接执行,没找到就在当前工作目录中继续寻找,如果还没找到,就报错。我们添加环境变量的目的就是能够在任意路径下的终端中直接调用 MySQL 中的相关程序而不用总是切换工作目录,大大方便了操作。

右键开始菜单设置系统系统信息,点击高级系统设置点击环境变量

image-20220524120703814

系统变量中新建MYSQL_HOME,之后点击确定

image-20220524121955493

系统变量中找到并编辑Path点击新建,输入%MYSQL_HOME%\bin,最后点击确定。

image-20220524122253224

如何验证是否添加成功?

右键开始菜单,选择Windeos终端(管理员),打开终端,敲入mysql,回车。 如果提示Can't connect to MySQL server on 'localhost'则证明添加成功。 如果提示mysql : 无法将“mysql”项识别为 cmdlet、函数、脚本文件或可运行程序的名称。请检查名称的拼写,如果包 括路径,请确保路径正确,然后再试一次。则表示添加失败,请重新检查步骤并重试。

2.2.2 新建配置文件

新建一个文本文件,写入以下内容:

把上面的文本文件另存为,在保存类型里选所有文件 (*.*),文件名为my.ini,存放的路径为MySQL的根目录(例如我的是D:\mysql-5.7.24-winx64根据自己的 MySQL 目录位置修改)。

image-20220524132604285

上面配置文本的意思是,配置数据库的默认编码集为utf-8和默认存储引擎为INNODB

2.2.3 初始化MySQL

在刚才的终端中敲入mysqld --initialize-insecure回车,稍微等待一会,如果没有出现报错信息则证明data目录初始化没有问题,此时再查看MySQL目录下已经有data目录生成。

image-20220524132939706

2.2.4 注册MySQL服务

注册服务就是将 MySQL 作为计算机系统后台的一个应用程序。

在终端里敲入mysqld -install,回车。

image-20220524135049031

现在你的计算机上已经安装好了 MySQL 服务了。

安装了 MySQL 服务的计算机便可以叫做:MySQL 服务器。

假设出现Install/Remove of the Service Denied!提示,请切换管理员权限终端再试

2.2.5 启动MySQL服务

在终端里敲入net start mysql,回车。

image-20220524141256232

2.2.6 修改默认账户密码

在终端里敲入mysqladmin -u root password 123456,这里的123456就是指默认管理员(即 root 账户)的密码,可以自行修改成你所需的。

image-20220524141712151

至此,MySQL 5.7.24 解压版安装完毕!

2.2.7 开启远程访问权限

MySQL 默认是不允许远程访问的,当我们需要远程访问时(比如连接云服务器中的数据库)那么就需要开启远程访问权限。

2.3 MySQL卸载

如果你想卸载 MySQL,也很简单。

右键开始菜单,选择Windeos终端(管理员),打开终端。

  1. 敲入net stop mysql,回车。
  1. 再敲入mysqld -remove mysql,回车。

image-20220524143004797

  1. 最后删除 MySQL 目录及相关的环境变量。

至此,MySQL 5.7.24 解压版卸载完成!

2.4 MySQL登陆和退出

2.4.1 登陆

右键开始菜单,选择Windeos终端(管理员),打开终端。 在终端中输入,mysql -uroot -p123456,回车,出现下图且左下角为mysql>,则登录成功。

image-20220524144644860

到这里你就可以开始你的 MySQL 之旅了!

2.4.2 退出

退出 MySQL:

2.5 MySQL数据模型

关系型数据库:

关系型数据库是建立在关系模型基础上的数据库,简单说,关系型数据库是由多张能互相连接的二维表组成的数据库。

如下图,订单信息表客户信息表 都是有行有列二维表我们将这样的称为关系型数据库。

image-20220524154454861

接下来看关系型数据库的优点:

数据模型:

image-20210721212754568

如上图,我们通过客户端利用数据库管理系统创建数据库,在数据库中创建表,在表中添加数据。创建的每一个数据库对应到磁盘上都是一个文件夹。比如可以通过 SQL 语句创建一个数据库(数据库名称为db01),语句如下。该语句咱们后面会学习。

image-20220524161342990

我们可以在数据库安装目录下的data目录下看到多了一个db01的文件夹。所以,在 MySQL 中一个数据库对应到磁盘上的一个文件夹。

image-20220524162257651

而一个数据库下可以创建多张表,我们到 MySQL 中自带的 mysql 数据库的文件夹目录下:

image-20220524162437313

而上图中右边的 db.frm 是表文件,db.MYD 是数据文件,通过这两个文件组合就可以构建数据二维表。

此处只是使用db.frmdb.MYD举例,其他的任意一张表也是同理。

小结:

2.6 MySQL文件结构

image-20220524163146371

三、SQL基础

了解了数据模型后,接下来我们就学习 SQL 语句,通过 SQL 语句对数据库、表、数据进行增删改查操作。

3.1 SQL简介

3.2 通用语法

3.3 SQL分类

注意: 以后我们最常操作的是 DMLDQL ,因为我们开发中最常操作的就是数据。

四、DDL数据库定义语言

我们先来学习 DDL 来操作数据库,而操作数据库主要就是对数据库的增删查操作。

4.1 查询

查询所有的数据库

运行上面语句效果如下:

image-20220524211446077

上述查询到的是的这些数据库是 mysql 安装好自带的数据库,是数据库的核心,请不要操作这些数据库。

4.2 创建数据库

而在创建数据库的时候,我并不知道 db01 数据库有没有创建,直接再次创建名为 db01 的数据库就会出现错误。

(Can't create database 'db01'; database exists)

为了避免上面的错误,在创建数据库的时候先做判断,如果不存在再创建。

运行语句效果如下:

image-20220524212434830

从上面的效果可以看到虽然 db01 数据库已经存在,再创建 db01 也没有报错,而创建 db02 数据库则创建成功。

MySQL 数据库同样是需要设置字符集的(有默认值),为了确保统一,我们推荐还是手动设置上,防止字符混乱的情况发生:

  • DEFAULT CHARACTER SET utf8:数据库字符集
  • COLLATE utf8_general_ci:数据库校对规则

4.3 删除数据库

运行语句效果如下:

image-20220524212621932

4.4 使用数据库

数据库创建好了,要在数据库中创建表,得先明确在哪个数据库中操作,此时就需要使用数据库。

运行语句效果如下:

image-20220524212833834

4.5 操作表

操作表也就是对表进行增(Create)删(Retrieve)改(Update)查(Delete)。

4.5.1 查询表

我们创建的数据库中没有任何表,因此我们进入 MySQL 自带的 mysql 数据库,执行上述语句查看。

image-20220524220842639

查看所在数据库中 func 表的结构,运行语句如下:

image-20220524221009109

4.5.2 创建表

注意:最后一行末尾,不能加逗号

知道了创建表的语句,那么我们创建创建如下结构的表

image-20210721230824097

运行语句如下:

image-20220524221518858

MySQL 表同样是需要设置字符集的(有默认值),为了确保统一,我们推荐还是手动设置上,防止字符混乱的情况发生:

  • ENGINE = INNODB:使用 InnoDB 引擎
  • DEFAULT CHARSET = utf8:数据库默认编码为 utf-8

4.5.3 数据类型

MySQL 支持多种类型,可以分为三类:

image-20220614231113980

案例:

需求:设计一张学生表,请注重数据类型、长度的合理性。

  1. 编号
  2. 姓名,姓名最长不超过 10 个汉字
  3. 性别,因为取值只有两种可能,因此最多一个汉字(一个汉字占两个字符,但是这里用 0 表示女,1 表示男)
  4. 生日,取值为年月日
  5. 入学成绩,小数点后保留两位
  6. 邮件地址,最大长度不超过 64
  7. 家庭联系电话,不一定是手机号码,可能会出现 - 等字符
  8. 学生状态(用数字表示,正常、休学、毕业...)

语句设计如下:

4.5.4 删除表

运行语句效果如下:

image-20220524223105954

4.5.5 修改表

4.6 Navicat使用

通过上面的学习,我们发现在命令行中写 SQL 语句特别不方便,尤其是编写创建表的语句,我们只能在记事本上写好后直接复制到命令行进行执行。那么有没有更好的工具提供给我们进行使用呢? 当然有!

4.6.1 Navicat概述

4.6.3 Navicat使用

建立和 MySQL 服务的连接

第一步: 点击连接,选择 MySQL

image-20220524224708803

第二步:填写连接数据库必要的信息

image-20220524224929152

以上操作没有问题就会提示“连接成功”。

连接成功后,双击数据库就可以打开数据库,就能看到如下图界面:

image-20220524225038098

通过下图操作创建表:

image-20220525003758006

image-20220524225745797

通过下图操作修改表结构:

设计表完成后,可以点击设计表,对表进行再修改。

image-20220524230019153

image-20220525000828477

按照如下图所示进行操作即可书写 SQL 语句并执行 SQL 语句。

首先,在某个数据库下新建查询:

image-20220525001337983

在编辑窗口中输入 SQL 代码,点击运行并在结果窗口中查看执行结果。

image-20220525001718366

注意:运行 SQL 语句有两种方式:1、运行全部 SQL 语句;2、运行选中的 SQL 语句

image-20220525002535043

image-20220525002923070

将数据库导出为 SQL 文件或执行 SQL 文件:

image-20220525003425453

五、DML

DML 主要是对数据进行增(insert)删(delete)改(update)操作。

5.1 添加数据

为了演示以下的增删改操作是否操作成功,故先将查询所有数据的语句介绍给大家:

5.2 修改数据

注意:

  1. 修改语句中如果不加 WHERE 条件,则将对所有的数据都修改!
  2. 像上面的语句中的中括号,表示在写 SQL 语句中可以省略这部分

5.3 删除数据

六、DQL

数据库查询操作是最重要的操作,所以此部分需要重点掌握。

接下来我们先介绍查询的完整语法:

注意:在进行 DQL 操作的时候,一定要符合下列命令的先后顺序!

为了给大家演示查询的语句,我们需要先准备表及一些数据:

接下来咱们从最基本的查询语句开始学起。

6.1 基础查询

6.1.1 语法

6.1.2 练习

image-20220614235638549

6.2 条件查询

6.2.1 语法

条件列表可以使用以下运算符:

符号功能
>大于
<小于
>=大于等于
<=小于等于
=等于
<>!=不等于
BETWEEN ... AND ...在某个范围之内(都包含)
IN(...)多选一
LIKE 占位符模糊查询,_单个任意字符,%多个任意字符
IS NULL是 NULL
IS NOT NULL不是 NULL
AND&&并且
OR||或者
NOT!非,不是

6.2.2 条件查询练习

6.2.3 模糊查询练习

模糊查询使用 LIKE 关键字,可以使用通配符进行占位:

  • _:代表单个任意字符
  • %:代表任意个数字符

6.3 排序查询

6.3.1 语法

上述语句中的排序方式有两种,分别是:

注意:如果有多个排序条件,那么只有当前边的条件值一样时,才会根据后一条件进行排序。

6.3.2 练习

6.4 聚合函数

6.4.1 概念

将一列数据作为一个整体,进行纵向计算。

如何理解呢?假设有如下表:

image-20220525030658627

现有一需求让我们求表中所有数据的数学成绩的总和,这就是对 math 字段进行纵向求和。

6.4.2 聚合函数分类

函数名功能
COUNT(列名)统计数量(一般选用不为 null 的列)
MAX(列名)最大值
MIN(列名)最小值
SUM(列名)求和
AVG(列名)平均值

6.4.3 聚合函数语法

注意:NULL 值不参与所有聚合函数运算。

6.4.4 练习

6.5 分组查询

6.5.1 语法

分组查询的本质其实就是:先按照某个条件对数据进行分组,然后对每一个组进行单独的查询。

注意:分组之后,查询的字段为聚合函数和分组字段,查询其他字段无任何意义。

6.5.2 练习

注意:如果 SQL 语句过长,那么推荐换行写。

WHERE 和 HAVING 区别:

6.6 分页查询

相信大家在很多网站都见过页面底部分页部件,如京东、百度、淘宝等。分页查询是将数据一页一页的展示给用户看,用户也可以通过点击查看下一页的数据,这样在面对大量数据的时候可以有效缓解性能压力,同时增加用户体验。

接下来我们先说分页查询的语法。

6.6.1 语法

注意: 上述语句中的起始索引是从 0 开始。

6.6.2 练习

从上面的练习推导出起始索引计算公式:

小提示:

分页查询在不同数据库中不一样。

  • MySQL:limit
  • Oracle:rownumber
  • SQL Server:top

七、约束

7.1 概述和分类

7.1.1 约束的概念

7.1.2 约束的分类

约束名称描述关键字
非空约束保证列中所有数据不能有 NULL 值NOT NULL
唯一约束保证列中所有数据各不相同UNIQUE
主键约束主键是一行数据的唯一标识,要求非空且唯一
(一张表只能有一个主键)
PRIMARY KEY
检查约束保证列中的值满足某一条件CHECK
默认约束保存数据时,未指定值采用默认值DEFAULT
外键约束外键用来让两个表的数据之间建立链接,保证数据的一致性和完整性
(一张表可以有多个外键)
FOREIGN KEY

注意:MySQL 不支持检查约束!对于数据的检查,我们可以放在逻辑代码中进行(例如 Java)。

7.2 约束案例

根据需求,为表添加合适的约束。

image-20220615014600564

注意:虽然一张表只能有一个主键,但是该主键是可以由该张表的多个字段共同构成的!

7.3 外键约束

概念:外键用来将两个表的数据之间建立联结,保证数据的一致性和完整性。

举例:员工表中每个员工的部门信息来源于部门表。

一致性:员工的部门信息一定来源于部门表,信息一致。

完整性:要删除某一个部门,前提是属于该部门的员工都已经删除了。

员工表为 “从表”,部门表为 “主表”。

一定是先创建主表,再创建从表!

image-20220615023107981

语法:

(1)添加约束

(2)删除约束

案例解决:

八、数据库设计

8.1 简介

8.1.1 软件的研发步骤

image-20220615031805178

8.1.2 数据库设计概念

8.1.3 数据库设计步骤

  1. 需求分析(数据是什么?数据具有哪些属性?数据与属性的特点是什么?)
  2. 逻辑分析(通过 ER 图对数据库进行逻辑建模,不需要考虑我们所选用的数据库管理系统)
  3. 物理设计(根据数据库自身的特点把逻辑设计转换为物理设计)
  4. 维护设计(对新的需求进行建表以及表优化等)

8.2 多表关系的实现

8.2.1 表关系

8.2.2 表关系的实现

(1)一对一

一对一关系多用于表拆分,将一个实体中经常使用的字段放一张表,不经常使用的字段放另一张表,用于提升查询性能。

实现方式:在任意一方加入外键,关联另一方的主键,并且设置外键为唯一(UNIQUE)。

image-20220615035300177

(2)一对多(多对一)

实现方式:再 “多” 的一方建立外键,指向 “一” 的一方的主键。

image-20220615033254662

(3)多对多

实现方式:建立第三张中间表,中间表至少包含两个外键,分布关联两方的主键。

无标题

通常,在第三张中间表中,我们还会存放一些其他数据,比如:购买数量。

无标题

多对多实现:

8.3 案例

无标题

九、多表查询

当我们需要同时在多个表中查询数据时,我们便需要使用多表查询。

例如:SELECT * FROM emp, dept;

多表查询的本质是笛卡儿积!

所以,当我们执行上面的语句时,得到的查询结果是将 emp 表与 dept 表的每一行数据都两两组合一遍,最终得到的数据很多是无意义的数据,所以,我们在使用多表查询的时候,一定要限定条件进行约束!例如,联结查询:

多表查询:从多张表查询数据。

image-20220615222004497

9.1 内联结

内联结查询语法:

9.2 外联结

外联结查询语法:

image-20220615230535733

9.3 子查询

子查询的概念:查询中嵌套查询,称嵌套的查询为子查询。

子查询根据查询结果不同,作用不同:

十、视图

10.1 视图简介

视图是虚拟的表。与包含数据的表不同,视图只包含使用时动态检索数据的查询。

举例:

可以发现,任何一个想要实现类似上述查询的人,都首先要对涉及到的表的结构非常清楚,并且熟悉如何进行联结查询。

而利用视图,我们便可以把以上查询操作封装成一个 “虚拟表”,表中的内容包含查询的结果,这样就这样直接使用这个表方便查询。

注意:我们应该创建可重用的视图!

比如在上面的例子中,我们所创建的视图返回了生产所有产品的客户,而不是仅仅是生产 TNT2 的客户,扩展视图的范围不仅使得它能被重用,而且甚至更有用。

视图的作业:

10.2 视图规则

10.3 视图的使用

十一、事务

11.1 事务简介

举例:付款流程

查询买家账号余额 ——> 买家账户余额减500 ——> 商家账号余额增500

(凡是以上 3 个步骤没有正常完成任何一个,那么整个流程就失败)

核心:要么同时成功,否则同时失败!

image-20220616005903550

11.2 事务的使用

11.3 事务四大特征

11.4 MySQL事务默认自动提交

其实,我们的每一条 SQL 操作都是一个事务,只不过 MySQL 是默认自动提交事务的。

十二、索引

12.1 MySQL索引简介

索引是 MySQL 数据库为了加快数据查询速度,给表中的某一个或者是某几个列添加的一种“目录”。MySQL 的索引是一个特殊的文件,但是 InnoDB 类型引擎的表的索引是表空间的一个组成部分。

MySQL 数据库一共支持 5 种类型的索引,分别是:普通索引、唯一性索引、主键索引、复合索引和全文索引,下面将对这四种类型的索引一一介绍。

12.2 MySQL五种类型索引详解

12.2.1 普通索引

普通索引是 MySQL 数据库中的一种索引,添加普通索引的列对数据没有特殊要求,普通索引能起到的作用就是加快查询速度。

在创建数据表时添加普通索引 SQL 语句示例如下:

或者可以把 INDEX 换成 KEY,如下:

在上述 SQL 命令中,KEY 或者 INDEX 表示添加索引,后面紧跟着的是索引名称,后面括号里的是要添加索引的列。

本文介绍的所有索引相关的 SQL 语句,如果没有特殊说明,INDEX 都可以换成 KEY,为了节省文章篇幅,这一点在以后就不再赘述了。此外,我们也可以在添加索引时,不指定索引的名称,这时,MySQL 会自动为该索引添加与该字段同名的索引名。

执行结构如下:

image-20220615180159501

创建数据表后向表内新添加普通索引 SQL 语句示例如下:

image-20220615180619759

创建数据表后删除普通索引的 SQL 语句示例如下:

image-20220615180935509

注意,在上述命令中,dix_name 是索引的名字而不是含有索引的字段的名字,如果我们忘记了该表中的索引名称,可以执行以下 SQL命令进项查询:

image-20220615182819354

从上面几张图片可以看出,添加普通索引后,在使用 DESC 查看表结构时,会发现 Key 列上出现 MUL,这就表示该列添加了普通索引。

12.2.2 唯一性索引

唯一性索引,是在普通索引的基础上,要求添加该索引的列所有的值只能出现一次。唯一性索引常用于添加在诸如:身份证号、学号等字段中,不可以添加在诸如:姓名、学校等字段中。

唯一性索引的添加与普通索引几乎完全相同,只不过要把普通索引的关键字 INDEX 和 KEY 换成 UNIQUE INDEXUNIQUE KEY

在创建数据表时添加唯一性索引的 SQL 语句示例如下:

上述命令执行结果如下:

image-20220615203720661

可以看出,添加唯一性索引的字段,在使用 DESC 命令查询表结构时,Key 列中会显示 UNI,表示该字段添加了唯一性索引。

在创建数据表后添加唯一性索引的 SQL 语句实例如下:

删除唯一性索引的 SQL 语句示例如下:

12.2.3 主键索引

主键索引,是数据库的所有索引中查询速度最快的,并且每个数据表只能有1个主键索引列。同时,主键索引的列,不允许出现重复的数据,也不允许为空值。

注意:主键索引,只能用 KEY,不能用 INDEX!

添加、删除主键索引与普通索引和唯一性索引非常相似,只不过将 Key 换成了 PRIMARY KEY 而已。相关 SQL 命令如下:

image-20220615204905014

主键索引的删除可以执行命令:

image-20220615205413361

有时,我们在尝试删除主键索引时,MySQL 会拒绝,这可能是因为该字段添加了 AUTO_INCREMENT 属性的缘故,我们可以把该字段修饰符删除,就可以删除该字段的主键索引了。

12.2.4 复合索引

如果想要创建一个包含不同的列的索引,我们就可以创建复合索引。其实,复合索引在业务场景中应用的非常频繁。比如,如果我们想要记录数据包的内容,则需要将 IP 和 端口号 作为标识数据包的依据,这时就可以把 IP 地址的列和 端口号 的列创建为复合索引。

创建、添加和删除复合索引 SQL 语句示例如下:

复合索引在创建后,在使用 DESC 查看数据表结构时,会在 Key 列中发现多个 PRI,这就表示这些含有 PRI 的列就是复合索引的列了。如下所示:

image-20220615210312497

注意:复合索引相当于一个多列的主键索引。因此,添加复合索引的任何一个列都不允许数据为空,并且这些列不允许数据完全相同,否则 MySQL 数据库会报错。

12.2.5 全文索引

全文索引主要是用于解决大数据量的情况下模糊匹配的问题。如果数据库中某个字段的数据量非常大,那么如果我们想要使用 LIKE 通配符的方式进行查找,速度就会变得非常慢。针对这种情况,我们就可以使用全文索引的方式,来加快模糊查询的速度。全文索引的原理是通过分词技术,分析处文本中关键字及其出现的频率,并依次建立索引。全文索引的使用,与数据库版本、数据表引擎乃至字段类型息息相关,主要限制如下:

  1. MySQL3.2 版本以后才支持全文索引
  2. MySQL5.6 之前的版本,只有 MyISAM 引擎才支持全文索引
  3. MySQL5.6 以后的版本,MyISAM 引擎和 InnoDB 引擎都支持全文索引
  4. MySQL5.7 版本以后 MySQL 才内置 ngram 插件,全文索引才开始支持中文
  5. 只有字段数据类型为 CHAR、VARCHAR、以及 TEXT 的字段才支持添加全文索引

创建、添加和删除全文索引 SQL 命令如下:

image-20220615212824245

在创建了全文索引后,也不能够使用 LIKE 通配符的方式进行模糊查询,全文索引的使用有其特定的语法,如下所示:

其中,MATCH 后面的括号里是含有全文索引的字段,AGAINST 后面的括号里是要模糊匹配的内容。

此外,全文索引的作用并不是唯一的,在很多场景下,我们并不会使用 MySQL 数据库内置的全文索引,而是使用第三方类似的索引以实现相同的功能。

三种全文搜索模式:

(1)自然语言模式(默认情况下为该模式)

(2)布尔搜索模式(目前了解即可,后续使用再深入研究)

12.3 MySQL索引使用原则

  1. 索引是典型的 “以空间换时间” 的策略,它会消耗计算机存储空间,但是会加快查询速度
  2. 索引的添加,尽管加快了在查询时的查询速度,但是会减慢在插入、删除时的速度。因为在插入、删除数据时需要进行额外的索引更新操作
  3. 索引并非越多越好,数据量不大时不需要添加索引
  4. 如果一个表的值需要频繁的插入和修改,则不适合建立索引,反之如果一个表中某个字段的值要经常进行查询、排序和分组则需要建立索引
  5. 如果一个字段满足建立唯一性索引的条件,就不要建立普通索引

十三、其它部分

这里只是对 MySQL 的其它知识做一个介绍,详细内容请参考其它资料。

【MySQL 存储过程和触发器】

存储过程是在数据库中定义一些 SQL 语句的集合,可以直接调用这些存储过程来执行已经定义好的 SQL 语句。避免了开发人员重复编写相同 SQL 语句的问题。

触发器和存储过程相似,都是嵌入到 MySQL 中的一段程序。触发器是由事件来触发某个操作。当数据库执行这些事件时,就会激活触发器来执行相应的操作。

【MySQL 存储过程】

我们前面所学习的 MySQL 语句都是针对一个表或几个表的单条 SQL 语句,但是在数据库的实际操作中,经常会有需要多条 SQL 语句处理多个表才能完成的操作。

例如,为了确认学生能否毕业,需要同时查询学生档案表、成绩表和综合表,此时就需要使用多条 SQL 语句来针对这几个数据表完成处理要求。

存储过程是一组为了完成特定功能的 SQL 语句集合。使用存储过程的目的是将常用或复杂的工作预先用 SQL 语句写好并用一个指定名称存储起来,这个过程经编译和优化后存储在数据库服务器中,因此称为存储过程。当以后需要数据库提供与已定义好的存储过程的功能相同的服务时,只需调用“CALL存储过程名字”即可自动完成。

常用操作数据库的 SQL 语句在执行的时候需要先编译,然后执行。存储过程则采用另一种方式来执行 SQL 语句。

一个存储过程是一个可编程的函数,它在数据库中创建并保存,一般由 SQL 语句和一些特殊的控制结构组成。当希望在不同的应用程序或平台上执行相同的特定功能时,存储过程尤为合适。

MySQL 5.0 版本以前并不支持存储过程,这使 MySQL 在应用上大打折扣。MySQL 从 5.0 版本开始支持存储过程,既提高了数据库的处理速度,同时也提高了数据库编程的灵活性

存储过程是数据库中的一个重要功能,存储过程可以用来转换数据、数据迁移、制作报表,它类似于编程语言,一次执行成功,就可以随时被调用,完成指定的功能操作。

使用存储过程不仅可以提高数据库的访问效率,同时也可以提高数据库使用的安全性。

对于调用者来说,存储过程封装了 SQL 语句,调用者无需考虑逻辑功能的具体实现过程。只是简单调用即可,它可以被 Java 和 C# 等编程语言调用。

编写存储过程对开发者要求稍微高一些,但这并不影响存储过程的普遍使用,因为存储过程有如下优点:

通常完成一个逻辑功能需要多条 SQL 语句,而且各个语句之间很可能传递参数,所以,编写逻辑功能相对来说稍微复杂些,而存储过程可以把这些 SQL 语句包含到一个独立的单元中,使外界看不到复杂的 SQL 语句,只需要简单调用即可达到目的。并且数据库专业人员可以随时对存储过程进行修改,而不会影响到调用它的应用程序源代码。

存储过程可以用流程控制语句编写,有很强的灵活性,可以完成复杂的判断和较复杂的运算。

由于存储过程是在服务器端运行的,且执行速度快,因此当客户计算机上调用该存储过程时,网络中传送的只是该调用语句,从而可降低网络负载。

当存储过程被成功编译后,就存储在数据库服务器里了,以后客户端可以直接调用,这样所有的 SQL 语句将从服务器执行,从而提高性能。但需要说明的是,存储过程不是越多越好,过多的使用存储过程反而影响系统性能。

存储过程提高安全性的一个方案就是把它作为中间组件,存储过程里可以对某些表做相关操作,然后存储过程作为接口提供给外部程序。这样,外部程序无法直接操作数据库表,只能通过存储过程来操作对应的表,因此在一定程度上,安全性是可以得到提高的。

数据的独立可以达到解耦的效果,也就是说,程序可以调用存储过程,来替代执行多条的 SQL 语句。这种情况下,存储过程把数据同用户隔离开来,优点就是当数据表的结构改变时,调用表不用修改程序,只需要数据库管理者重新编写存储过程即可。

【MySQL 存储函数】

存储函数和存储过程一样,都是在数据库中定义一些 SQL 语句的集合。存储函数可以通过 return 语句返回函数值,主要用于计算并返回一个值。而存储过程没有直接返回值,主要用于执行操作。

【MySQL 游标】

在 MySQL 中,存储过程或函数中的查询有时会返回多条记录,而使用简单的 SELECT 语句,没有办法得到第一行、下一行或前十行的数据,这时可以使用游标来逐条读取查询结果集中的记录。游标在部分资料中也被称为光标。

关系数据库管理系统实质是面向集合的,在 MySQL 中并没有一种描述表中单一记录的表达形式,除非使用 WHERE 子句来限制只有一条记录被选中。所以有时我们必须借助于游标来进行单条记录的数据处理。

一般通过游标定位到结果集的某一行进行数据修改。

结果集是符合 SQL 语句的所有记录的集合。

个人理解游标就是一个标识,用来标识数据取到了什么地方,如果你了解编程语言,可以把他理解成数组中的下标。

不像多数 DBMS,MySQL 游标只能用于存储过程和函数。

【MySQL 用户管理】

MySQL 是一个多用户数据库,具有功能强大的访问控制系统,可以为不同用户指定不同权限。在前面的章节中我们使用的是 root 用户,该用户是超级管理员,拥有所有权限,包括创建用户、删除用户和修改用户密码等管理权限。

为了实际项目的需要,可以创建拥有不同权限的普通用户。

【MySQL 数据库备份与恢复】

尽管采取了一些管理措施来保证数据库的安全,但是在不确定的意外情况下,总是有可能造成数据的损失。例如,意外的停电,不小心的操作失误等都可能造成数据的丢失。

所以为了保证数据的安全,我们需要定期对数据进行备份。如果数据库中的数据出现了错误,就需要使用备份好的数据进行数据还原,这样可以将损失降至最低。

MySQL 提供了多种方法对数据进行备份和恢复。

【MySQL 日志】

任何一种数据库,都会拥有各种各样的日志,用来记录数据库的运行情况、日常操作和错误等信息,可以帮助我们诊断数据库出现的各种问题。

MySQL 也不例外,它有不同类型的日志文件,各自存储了不同类型的日志。分析这些日志文件,除了可以了解 MySQL 数据库的运行情况,还可以为 MySQL 的管理和优化提供必要的信息。

日志管理是维护数据库的重要步骤,所以经常需要在 MySQL 中进行日志启动、查看、停止和删除等操作。这些操作是数据库管理中最基本、最重要的操作。

【MySQL 性能优化】

应用开发过程中,由于初期数据量小,开发人员更重视功能上的实现,但是当应用系统正式上线后,随着生产数据量的急剧增长,数据库开始显露性能问题,对生产的影响也越来越大,因此我们必须对它们进行优化。

性能优化是通过某些有效的方法提高 MySQL 数据库的性能,比如优化查询速度、优化更新速度和优化 MySQL 服务器等,主要是为了使 MySQL 数据库运行速度更快、占用的磁盘空间更小。